import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import java.util.ArrayList;


public class Widok extends JPanel implements KeyListener, Runnable {
	
	private Image sciana, waz, owocImage1, owocImage2, owocAct;
	private boolean prawo=true;
	private boolean lewo=false;
	private boolean gora=false;
	private boolean dol=false;
	public static Thread watek;
	Integer wynik=0,x=100,y=100,pouseTime=0,dlugosc=0;
	ArrayList<Point> pozWeza = new ArrayList<Point>();
	private Owoc owoc;
	private ImageIcon iconOwoc1, iconOwoc2;
	
	Widok(){
		addKeyListener(this);
		przygotujPlansze();
		watek = new Thread(this);
	}
	
	private void przygotujPlansze(){
		setBounds(20,20,440,340);
		setBackground(Color.gray);
		setVisible(true);
		
		ImageIcon iconSciana = new ImageIcon(this.getClass().getResource("/image/sciana.jpg"));
		sciana = iconSciana.getImage();
		
		ImageIcon iconWaz = new ImageIcon(this.getClass().getResource("/image/waz.jpg"));
		waz = iconWaz.getImage();
		
		iconOwoc1 = new ImageIcon(this.getClass().getResource("/image/owoc1.jpg"));
		owocImage1 = iconOwoc1.getImage();
		
		iconOwoc2 = new ImageIcon(this.getClass().getResource("/image/owoc2.jpg"));
		owocImage2 = iconOwoc2.getImage();
		
		owocAct = owocImage1;
	}
	
	void inicjujWeza(){
		dlugosc=(Integer)Snake.dlugoscSpinner.getValue();
		
		for(int i=0;i<dlugosc;i++){
			pozWeza.add(new Point(100+(i*10),100));
		}
	}
	
	boolean zbierajOwoc(){
		if(pozWeza.contains(owoc)){
			owoc.zebrane++;
			Snake.zebraneScore.setText( owoc.zebrane.toString() );
			if( owoc.zebrane % 5 == 0 ){
				owocAct = owocImage2;
				owoc.setFruitType(2);
			}else{
				owocAct = owocImage1;
				owoc.setFruitType(1);
			}
			return true;
		}
		return false;
	}
	
	public void paint(Graphics g){
		super.paint(g);
		for (int i = 0; i <= 440; i += 10) {
			g.drawImage(sciana, i, 0, this);
			g.drawImage(sciana, i, 330, this);
			}
		for (int i=0; i<=340; i+=10){
			g.drawImage(sciana, 0, i, this);
			g.drawImage(sciana, 430, i, this);
		}
		
		for(int i=0;i<pozWeza.size();i++){
			g.drawImage(waz, pozWeza.get(i).x, pozWeza.get(i).y, this);
		}
		try{
			g.drawImage(owocAct, owoc.x, owoc.y, this);
		}catch(Exception e){}
	}
	
	private void rosnij(){
		if(pozWeza.get(0).x == pozWeza.get(1).x){
			pozWeza.add(0, new Point (pozWeza.get(0).x, pozWeza.get(0).y+10));
		} else {
			pozWeza.add(0, new Point (pozWeza.get(0).x + 10, pozWeza.get(0).y));
		}
	}
	
	private void ruch(){
		int rozmiarWeza = pozWeza.size()-1;
		if(gora){
			pozWeza.add(new Point(pozWeza.get(rozmiarWeza).x, pozWeza.get(rozmiarWeza).y - 10));
			pozWeza.remove(0);
		}
		if(dol){
			pozWeza.add(new Point(pozWeza.get(rozmiarWeza).x, pozWeza.get(rozmiarWeza).y + 10));
			pozWeza.remove(0);
		}
		if(lewo){
			pozWeza.add(new Point(pozWeza.get(rozmiarWeza).x - 10, pozWeza.get(rozmiarWeza).y));
			pozWeza.remove(0);
		}
		if(prawo){
			pozWeza.add(new Point(pozWeza.get(rozmiarWeza).x + 10, pozWeza.get(rozmiarWeza).y));
			pozWeza.remove(0);
		}
	}
	
	public void run(){
		owoc=new Owoc();
		inicjujWeza();
		owoc.losuj();
		owoc.setFruitType(1);
		for(;;){
			ruch();
			repaint();
			if( zbierajOwoc() ){
				owoc.losuj();
				rosnij();
			}
            try {
            	pouseTime = 500/(Integer)Snake.szybkoscSpinner.getValue();
                Thread.sleep(pouseTime);
            }
            catch (InterruptedException ie){}
            catch(Exception e){}
		}
	}
	
	public void keyPressed(KeyEvent e){
		Integer key = e.getKeyCode();
		if(key==38 && !dol){
			gora=true;
			dol=false;
			prawo=false;
			lewo=false;
		}
		if(key==40 && !gora){
			gora=false;
			dol=true;
			prawo=false;
			lewo=false;
		}
		if(key==39 && !lewo){
			gora=false;
			dol=false;
			prawo=true;
			lewo=false;
		}
		if(key==37 && !prawo){
			gora=false;
			dol=false;
			prawo=false;
			lewo=true;
		}
	}
		
    public void keyReleased(KeyEvent e) {
    }

    public void keyTyped(KeyEvent e) {
    }
}